/*-------------------------------------------------------------------------
 *
 * citus_clauses.h
 *  Routines roughly equivalent to postgres' util/clauses.
 *
 * Copyright (c) Citus Data, Inc.
 *
 *-------------------------------------------------------------------------
 */

#ifndef CITUS_CLAUSES_H
#define CITUS_CLAUSES_H

#include "nodes/execnodes.h"
#include "nodes/nodes.h"
#include "nodes/parsenodes.h"

/*
 * CoordinatorEvaluationMode is used to signal what expressions in the query
 * should be evaluated on the coordinator.
 */
typedef enum CoordinatorEvaluationMode {
    /* evaluate nothing */
    EVALUATE_NONE = 0,

    /* evaluate only external parameters */
    EVALUATE_PARAMS,

    /* evaluate both the functions/expressions and the external paramaters */
    EVALUATE_FUNCTIONS_PARAMS
} CoordinatorEvaluationMode;

/*
 * This struct is used to pass information to master
 * evaluation logic.
 */
typedef struct CoordinatorEvaluationContext {
    PlanState* planState;
    CoordinatorEvaluationMode evaluationMode;
} CoordinatorEvaluationContext;

extern bool RequiresCoordinatorEvaluation(Query* query);
extern void ExecuteCoordinatorEvaluableExpressions(Query* query, PlanState* planState);
extern Node* PartiallyEvaluateExpression(
    Node* expression, CoordinatorEvaluationContext* coordinatorEvaluationContext);
extern bool CitusIsVolatileFunction(Node* node);
extern bool CitusIsMutableFunction(Node* node);

#endif /* CITUS_CLAUSES_H */
